開始進入從 0 到 1 建立測試專案的流程,但在此之前需要先學會應用版本控制的工具 Git 。學習如何設計開發,版控的流程。
Git 是一個分散式版本控制系統,用於管理和追蹤軟體程式碼的變更。
以下是使用 Git 的一些主要原因:
版本控制: 記錄每次的更改,並保留每個版本的歷史記錄 (包括修改人 / 時間 / 內容),出現了錯誤或問題,能夠輕鬆回溯、比較和恢復不同的版本。
遠程協作: 允許在不同地點的開發者之間進行協作。你可以將代碼推送到遠程 儲存庫 (Repository),讓其他人能夠查看、評審和使用你的更改。
多人協作: 團隊成員可以同時在不同 分支 (Branch) 上工作,每個人可以獨立進行更改,然後將這些更改 合併 (Merge) 回主幹。這有助於避免代碼衝突和確保有效的協作,也允許同時進行不同特性的開發。
如下例:
圖片來源: https://nulab.com/zh-tw/learn/software-development/git-tutorial/
安裝 Git: 參考文件,根據作業系統安裝,用以進行 Git 的操作。
應用 Git Service: Git 本來是免費的開源軟體,讓我們可以自己架起 Git Server 作使用,但我們一般會使用商家的 Git Service 如 Github、Gitlab、Bitbucket 等,會有更多的管理功能。他們都有各自有免費的方案可以使用,同時亦會有進階的收費服務,詳情可以參看官方網站。初學的選用其中一個來創建應用,並根據各個官方文件 (GitHub, Gitlab, BitBucket) 以應用 SSH 使本地端與遠端連接。
**SSH(Secure Shell)**是一種加密的網路傳輸協定,可在不安全的網路中為網路服務提供安全的傳輸環境。
開始使用專案
git init
的指令來使本機的專案初始化為 Git Repository ( Git 存儲庫),會建立 Local 的 Git Repository 以及創建名為 master/main 的默認分支。git clone
從 Remote Repository 的主分支內容複製到 Local Repository (本地儲存庫),使可以在本地編輯開發。Repository(儲存庫) ,是指存儲和管理軟體代碼及相關文件的地方,用於版本控制和協作一般包含項目的全部歷史記錄、不同版本的代碼、配置文件、文檔、圖像等,分別有 遠端 (Remote) 儲存庫和 本地端 (Local) 儲存庫。
Stage (暫存) 用於指定哪些修改要包含在下一次提交中。當你對代碼進行了一些更會存放到 Stage,以便稍後 提交 (Commit) 。
Working Space(工作區) 是指正在進行編輯和修改的實際代碼文件的位置,對文件進行更改的地方,包括新增、修改或刪除文件內容。
對於獨立的分支,常用的 Git Command 如下:
git add
指令將新檔案從 Work Space 新增到 Stage。git commit
指令將 Stage 中的更改提交到版本庫中,會記錄你所做的更改以及相關的 提交信息 (Commit Message)。 (這裡需要提醒務必寫有意義的 Commit Message 以更好的識別修改內容,才能提供日後有效的追蹤)git push
指令可以將 Local Repository 的更改推送到 Remote Repository,使其他團隊成員可以查看和下載這些更改。git pull
指令可以從 Remote Repository 拉取最新的更改,並將它們合併到本地版端儲存庫中,再將合併的更改應用到你的工作區,以便在本地計算機上查看和編輯這些更改。對於分支之間的操作,常用的 Git Command 如下:
Switch (切換分支): 使用 git switch
命令可以切換到不同的分支,或者創建新的分支。 git switch
是 Git 2.23 版本引入的新命令,比 git checkout
更單純的處理切換分支的操作。
Checkout (切換分支或單一文件):git checkout
同樣可以切換及創建分支,甚至切換到分支的某個 commit 版本,還可以指定文件切到特定的提交版本。 git checkout
代表的功能太多,於指令的應用上也不夠直觀,比較容易誤用而發生非預期的錯誤,所以較建議初學者應用 git switch
作單純的切換分支操作。
Merge (合併): git merge
指令用於將一個分支的更改合併到另一個分支。
Rebase (變基): git rebase
將一個分支的提交歷史重新應用在另一個分支的操作,目的是創建一個更整潔的提交歷史,而不是單純地合併分支。
引用下圖講述 git merge
跟 git rebase
的分別,雖然最後 Source Code 的內容一樣,但 Rebase 會有很清晰的歷史紀綠。對於日後若要進行退版操作,更清楚的知道選擇哪個版本。
圖片來源:https://twitter.com/alexxubyte/status/1617926474279030784
Cherry-pick (擇優選擇): 把指定的分支的某個 Commit 加入到當前的分支。
圖片來源:https://nulab.com/zh-tw/learn/software-development/git-tutorial/
上圖簡單展示我們常用的 Git 使用流程:
Develop Branch
作開發的綜合分支,收集各 Feature 分支開發的內容。Develop Branch
切出分支來作個別的開發 (I.e. Feature A / B Branch
),使可以基於 Develop Branch
的內容進行開發。Feature A / B Branch
開發完成後,可以 Merge 到 Develop Branch
。Feature A 修改的內容若會影響到 Feature B 的開發,會使用 rebase 來更新 Feature B 的基底內容。Develop Branch
確認沒有 Conflict (版本衝突) 以及測試過後,會再 Merge 到 Master Branch
作正式的使用。Develop / Master Branch
需要設權限避免未經審核的內容 Merge 到重要的分支,所以一般我們在這個過程需要發 Pull Request (合併請求),讓有權限的帳號作審查 (Code Review) 確認才 Merge 到重要分支。這只是一般簡單的使用流程,實際的應用需要根據實際的開發流程設計,像是系統的開發還會有 hotfix,release 等分支的設計。
合併分支時,如果兩個分支對同一個部分進行了不同的更改,就會產生 Conflict。
解決的步驟如下:
確認衝突: 在執行 git merge
或 git pull
後,系統會通知你存在合併衝突。你可以運行 git status
查看哪些檔案有衝突。
解決衝突: 打開有衝突的檔案,你會看到類似以下的內容:
<<<<<<< HEAD
這是在 main 分支上的內容
=======
這是在 feature 分支上的內容
>>>>>>> feature
這表示 <<<<< HEAD
到 =======
之間是 main
分支的內容,而 =======
到 >>>>>> feature
之間是 feature
分支的內容。你需要手動選擇要保留的內容,或根據需要編輯內容。
解決衝突並保存: 編輯衝突的部分,將其修改為你想要的內容。然後保存檔案。
完成合併: 當你解決了所有衝突並暫存了解決的更改,使用 git commit
來確認合併。
繼續合併: 如果有多個檔案有衝突,繼續重複上述步驟,直至解決所有衝突。
解決合併衝突需要謹慎和耐心,確保選擇正確的更改,以保持程式碼的一致性和功能。
Revert(還原): git revert
指令是一種創建新提交來取消之前的提交的方法,而不是從歷史中刪除提交。這是一種安全的方法,因為它不會更改過去的歷史。Revert 會創建一個新的提交,將之前的提交的更改反轉,從而還原更改。這樣可以保留先前的歷史記錄,並在需要時能夠很容易地找回這些變更。
Reset(重設): git reset
退回指定的版本,會刪除之前的新增紀錄。
它有不同的模式,例如 -soft
、-mixed
和 -hard
。
-soft
,工作區和暫存區的更改不會被修改。這意味著你可以重新提交之前的更改,而不需要重新編輯它們。
-mixed
將工作區保留為未提交的更改,刪除暫存區的更改,可以重新將這些更改添加到暫存區。
-hard
清除工作區和暫存區的所有更改。
git 除了用 command 操作,亦有很多有介面的工具 (I.e. Fork Source Tree 等),操作相對簡單,但前提需要了解每個指令的意義。此外,很多 IDE 也配有 Git 的使用工具,像是 Pycharm,而 VSCode 亦可安裝 Git 的 Plugin 來使用。
這篇簡單提及 Git 的基本應用,它是對於版本控制及協作流程管理是非常實用的工具。